package jdbc;

import java.sql.*;

/*
* 完成用户登录功能
* 程序启动后要求输入用户名和密码，然后取userinfo表中检索
* 是否存在该注册用户，如果可以检索出记录认为是登录成功，否则登录失败
* SELECT id,username,password,nickname,age
 * FROM userinfo
 * WHERE username='输入的' AND password='输入的'
 *
* */
public class LoginDemo {
    public static void main(String[] args) {
        UserInfo userInfo = InputUtil
                .getInputObject(new UserInfo(),
                        "欢迎登录","登录");
        System.out.println(userInfo);


        try (
              Connection connection = DBUtil.getConnection();//获取连接
              ){
            //有漏洞：
 /*           Statement statement = connection.createStatement();//创建sql语句的对象
            String sql ="SELECT id,username,password,nickname,age "+
                        "FROM userinfo "+
                        "WHERE username= '"+userInfo.getUsername()+"' "+
                        "AND password= '"+userInfo.getPassword()+"' ";
            ResultSet rs = statement.executeQuery(sql);//执行sql语句，返回结果集
            */

            //预编译SQL，将值先用"?"占位，将SQL语义定死。没有任何拼接用户输入信息的操作
            String sql ="SELECT id,username,password,nickname,age "+
                        "FROM userinfo "+
                        "WHERE username=? AND password=? ";
             /*
                创建PreparedStatement时，就先将预编译SQL语句发送给数据库，此时数据库
                会根据予以生成执行计划(数据库理解了该SQL的意图)，只是还无法执行，因为
                缺少用户名和密码的值
             */
            PreparedStatement ps = connection.prepareStatement(sql);//
            //通过PreparedStatement为预编译SQL中占位的两个?设置值
            ps.setString(1,userInfo.getUsername());//1代表的是第一个问号
            ps.setString(2,userInfo.getPassword());
            //此时执行时会将两个值发送给数据库取执行查询操作
            //数据库也仅会将两个值就当作值使用，哪怕里面还有SQL关键字也不会当作SQL使用
            ResultSet rs = ps.executeQuery();

            if (rs.next()){
                System.out.println("登录成功");
            }else {
                System.out.println("登录失败");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
